
/*eslint-disable*/
// (function(root, factory) {
//   if (typeof exports === 'object') {
//     module.exports = factory();
//   } else if (typeof define === 'function' && define.amd) {
//     define(factory);
//   } else {
//     root.JSONToExcelConvertor = factory();
//   }
// })(this, function() {
// 获取二级表头
var getChild = function(columns) {
  var arr = [];
  for (var i = 0, l = columns.length; i < l; i++) {
    var children = columns[i].children;
    if (children) {
      for (var j = 0; j < children.length; j++) {
        arr.push(children[j]);
      }
    }
  }
  return arr;
};

var deepClone = function(obj) {
  var tmp = '';
  var result = '';
  tmp = JSON.stringify(obj);
  result = JSON.parse(tmp);
  return result;
};

var getLastChild = function(columns) {
  var ary = [];
  var each = function(data) {
    data.forEach(function(item) {
      if (item.children) {
        each(item.children);
      } else {
        ary.push(item);
      }
    });
  };
  each(columns);
  return ary;
};

// 获取表头columns最大层级
var getMaxFloor = function(treeData) {
  var max = 0;
  var _treeData = deepClone(treeData);
  var each = function(data, floor) {
    data.forEach(function(item) {
      item.floor = floor;
      if (floor > max) {
        max = floor;
      }
      if (item.children) {
        each(item.children, floor + 1);
      }
    });
  };
  each(_treeData, 1);
  return {
    max: max,
    _treeData: _treeData
  };
};

var getColspan = function(arr) {
  var ary = [];
  var each = function(data) {
    data.forEach(function(item) {
      ary.push(item);
      if (item.children) {
        each(item.children);
      }
    });
  };
  each(arr);
  return ary.filter(function(item) { return item.children === undefined; }).length;
};

var handleColumns = function(columns, max) {
  var _columns = deepClone(columns);
  var each = function(data) {
    data.forEach(function(item) {
      if (item.children) {
        item.colspan = getColspan([item]);
        item.rowspan = 1;
      } else {
        item.colspan = 1;
        item.rowspan = max - item.floor + 1;
      }
      if (item.children) {
        each(item.children);
      }
    });
  };
  each(_columns);
  return _columns;
};

var thead = function(columns) {
  var ary = [columns];
  var each = function(data) {
    var arr = getChild(data);
    ary.push(arr);
    if (arr.length) {
      each(arr);
    }
  };
  each(columns);
  return ary;
};

var createTd = function(ary) {
  var td = '';
  ary.forEach(function(item) {
    td += '<th colspan="' + item.colspan + '"  rowspan="' + item.rowspan + '">' + item.label + '</th>';
  });

  return td;
};

// 设置多级表头

var createThead = function(columns, max,isHideIndex) {
  var theadList = thead(columns).filter(function(item) { return item.length; });
  var tr = '';
  theadList.forEach(function(item, index) {
    if(isHideIndex){
      tr += '<tr>' + createTd(item) + '</tr>';
    } else {
      if (index === 0) {
        tr += '<tr><th rowspan=' + max + '>序号</th>' + createTd(item) + '</tr>';
      } else {
        tr += '<tr>' + createTd(item) + '</tr>';
      }
    } 
  });
  return tr;
};

// 设置数据
var createData = function(data, columns,isHideIndex) {
  var lastChild = getLastChild(columns);
  var row = '';
  var th = function(item) {
    var th = '';
    lastChild.forEach(function(v) {
			var value = item[v.prop] ? item[v.prop] : '';
      if(value && typeof value === 'object'){
        th += '<th style='+value['style']+'>' + value['value'] + '</th>';
     }else{
        th += '<th>' + value + '</th>';
     }
    });
    return th;
  };
  data.forEach(function(item, index) {
    const thCol = isHideIndex ? '' : `<th>${++index}</th>`;
    row += '<tr>' + thCol + th(item) + '</tr>';
  });

  return row;
};

var createTable = function(columns, data,isHideIndex,isHideTableHead) {
  var maxFloor = getMaxFloor(columns);

  var max = maxFloor.max;

  var _treeData = maxFloor._treeData;

  var newColumns = handleColumns(_treeData, max);
  var thead = '';
  if(!isHideTableHead){
    thead = createThead(newColumns, max,isHideIndex);
  }
  var tableData = createData(data, columns,isHideIndex);

 // var table = '<table id="tab" cellpadding="1" cellspacing="1" border="1">' + thead + tableData + '</table>';
  var table =  thead + tableData ;

  return table;
};

var saveAs = saveAs || (function(view) {
  'use strict';
  // IE <10 is explicitly unsupported
  if (typeof view === 'undefined' || typeof navigator !== 'undefined' && /MSIE [1-9]\./.test(navigator.userAgent)) {
    return;
  }
  var doc = view.document;
  // only get URL when necessary in case Blob.js hasn't overridden it yet
  var get_URL = function() {
    return view.URL || view.webkitURL || view;
  };
  var save_link = doc.createElementNS('http://www.w3.org/1999/xhtml', 'a');
  var can_use_save_link = 'download' in save_link;
  var click = function(node) {
    var event = new MouseEvent('click');
    node.dispatchEvent(event);
  };
  var is_safari = /varructor/i.test(view.HTMLElement) || view.safari;
  var is_chrome_ios = /CriOS\/[\d]+/.test(navigator.userAgent);
  var throw_outside = function(ex) {
    (view.setImmediate || view.setTimeout)(function() {
      throw ex;
    }, 0);
  };
  var force_saveable_type = 'application/octet-stream';
  // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
  var arbitrary_revoke_timeout = 1000 * 40; // in ms
  var revoke = function(file) {
    var revoker = function() {
      if (typeof file === 'string') { // file is an object URL
        get_URL().revokeObjectURL(file);
      } else { // file is a File
        file.remove();
      }
    };
    setTimeout(revoker, arbitrary_revoke_timeout);
  };
  var dispatch = function(filesaver, event_types, event) {
    event_types = [].concat(event_types);
    var i = event_types.length;
    while (i--) {
      var listener = filesaver['on' + event_types[i]];
      if (typeof listener === 'function') {
        try {
          listener.call(filesaver, event || filesaver);
        } catch (ex) {
          throw_outside(ex);
        }
      }
    }
  };
  var auto_bom = function(blob) {
  // prepend BOM for UTF-8 XML and text/* types (including HTML)
  // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
    if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
      return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type });
    }
    return blob;
  };
  var FileSaver = function(blob, name, no_auto_bom) {
    if (!no_auto_bom) {
      blob = auto_bom(blob);
    }
    // First try a.download, then web filesystem, then object URLs
    var filesaver = this;
    var type = blob.type;
    var force = type === force_saveable_type;
    var object_url;
    var dispatch_all = function() {
      dispatch(filesaver, 'writestart progress write writeend'.split(' '));
    };
    // on any filesys errors revert to saving with object URLs
    var fs_error = function() {
      if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
      // Safari doesn't allow downloading of blob urls
        var reader = new FileReader();
        reader.onloadend = function() {
          var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
          var popup = view.open(url, '_blank');
          if (!popup) view.location.href = url;
          url = undefined; // release reference before dispatching
          filesaver.readyState = filesaver.DONE;
          dispatch_all();
        };
        reader.readAsDataURL(blob);
        filesaver.readyState = filesaver.INIT;
        return;
      }
      // don't create more object URLs than needed
      if (!object_url) {
        object_url = get_URL().createObjectURL(blob);
      }
      if (force) {
        view.location.href = object_url;
      } else {
        var opened = view.open(object_url, '_blank');
        if (!opened) {
        // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
          view.location.href = object_url;
        }
      }
      filesaver.readyState = filesaver.DONE;
      dispatch_all();
      revoke(object_url);
    }
  ;
    filesaver.readyState = filesaver.INIT;
    if (can_use_save_link) {
      object_url = get_URL().createObjectURL(blob);
      setTimeout(function() {
        save_link.href = object_url;
        save_link.download = name;
        click(save_link);
        dispatch_all();
        revoke(object_url);
        filesaver.readyState = filesaver.DONE;
      });
      return;
    }
    fs_error();
  };
  var FS_proto = FileSaver.prototype;
  var saveAs = function(blob, name, no_auto_bom) {
    return new FileSaver(blob, name || blob.name || 'download', no_auto_bom);
  };
  // IE 10+ (native saveAs)
  if (typeof navigator !== 'undefined' && navigator.msSaveOrOpenBlob) {
    return function(blob, name, no_auto_bom) {
      name = name || blob.name || 'download';
      if (!no_auto_bom) {
        blob = auto_bom(blob);
      }
      return navigator.msSaveOrOpenBlob(blob, name);
    };
  }
  FS_proto.abort = function() {};
  FS_proto.readyState = FS_proto.INIT = 0;
  FS_proto.WRITING = 1;
  FS_proto.DONE = 2;
  FS_proto.error =
  FS_proto.onwritestart =
  FS_proto.onprogress =
  FS_proto.onwrite =
  FS_proto.onabort =
  FS_proto.onerror =
  FS_proto.onwriteend =
    null;
  return saveAs;
}(
  typeof self !== 'undefined' && self ||
  typeof window !== 'undefined' && window ||
  this.content
));
// isHideIndex 是否显示序列号
//  关于div有值后，div值放在哪里的配置
//  obj {
//    isPre       是否在表格的前面增加div
//    isInTable,   是否放在表格里面
//     nextEleInTable  在表格后面的元素是否放在表格里面
//    } 
export const  JSONToExcelConvertor = function(columns, data, FileName,div,isHideIndex,obj,tableNextEle,isHideTableHead) {
  var table = createTable(columns, data,isHideIndex,isHideTableHead);
  var tablePre = '<table  cellpadding="1" id="tab" cellspacing="1" border="1">';
  var tableAfter = '</table>';
  if(div){
    if(obj.isInTable){
      table = obj.isPre ?  tablePre + div + table + tableAfter :  tablePre + table  + div + tableAfter;
    }else {
      table = obj.isPre ? div + tablePre   + table + tableAfter :  tablePre + table + tableAfter + div ;
    }
  }else{
    table = tablePre + table + tableAfter;
  }
  if(tableNextEle){
    const tableNextPre = `<table  cellpadding="1" id="tab1" cellspacing="1" border="1">`;
    table = obj.nextEleInTable ? table +  tableNextPre + tableNextEle + tableAfter : table + tableNextEle;
  }
  var excelFile = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
  excelFile += '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
  excelFile += '<meta http-equiv="content-type" content="application/vnd.ms-excel';
  excelFile += '; charset=UTF-8">';
  excelFile += '<head>';
  excelFile += '<!--[if gte mso 9]>';
  excelFile += '<xml>';
  excelFile += '<x:ExcelWorkbook>';
  excelFile += '<x:ExcelWorksheets>';
  excelFile += '<x:ExcelWorksheet>';
  excelFile += '<x:Name>';
  excelFile += '{worksheet}';
  excelFile += '</x:Name>';
  excelFile += '<x:WorksheetOptions>';
  excelFile += '<x:DisplayGridlines/>';
  excelFile += '</x:WorksheetOptions>';
  excelFile += '</x:ExcelWorksheet>';
  excelFile += '</x:ExcelWorksheets>';
  excelFile += '</x:ExcelWorkbook>';
  excelFile += '</xml>';
  excelFile += '<![endif]-->';
  excelFile += '</head>';
  excelFile += '<body>';
  excelFile += table;
  excelFile += '</body>';
  excelFile += '</html>';

  // saveAs兼容ie
  var blob = new Blob([excelFile], { type: 'application/vnd.ms-' + 'excel' });
  saveAs(blob, FileName + '.' + 'xls');
};
// });

